import axios from "axios";
import store from '@/store'
import { Toast } from 'vant';
import router from "@/router";

const request = axios.create({
  baseURL: 'http://toutiao.itheima.net'
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  const user = store.state.user;
  if (user && user.token && !config.headers.Authorization) {
    config.headers.Authorization = `Bearer ${store.state.user.token}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  const { data } = response;
  return data || response
}, async function (error) {

  if (error.response) {
    // console.log(error.response);
    // 判断服务器响应返回的报错是否是否是401
    if (error.response.status === 401) {
      //  1. 先判断vuex中有没有refresh_token,没有就清空token，并跳转到登录页面
      const user = store.state.user
      if (user && user.refresh_token) {
        // 如果有refresh_token就直接拿refresh_token去服务器拿最新的token
        try {
          const res = await request({
            method: 'PUT',
            url: '/v1_0/authorizations',
            headers: {
              Authorization: `Bearer ${user.refresh_token}`
            }
          })
          // 拿到新的最新的token,就把vuex中过期的token值和refresh_token值换成最新的token和refresh_token
          store.commit('setUser', {
            token: res.data.token,
            refresh_token: user.refresh_token
          })
          // 然后再拿着原来的调用的接口的信息，重新调用接口，拿到数据返回给调用的地方
          error.config.headers.Authorization = ''
          return request(error.config)
        } catch (err) {
          // 3. 如果调刷新token的接口失败就说明refresh_token过期，就清空token，并跳转到登录页
          // 清空token & 跳转到登录页
          store.commit('setUser', null)
          router.push('/login')
        }
      } else {
        store.commit('setUser', null)
        router.push('/login')
      }
    }
    Toast.fail(error.response.data.message);
  } else {
    Toast.fail("网络异常");
  }
  return Promise.reject(error);
});

export default request